package helper

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"regexp"
	"strings"
	"unicode"
)

type CommonHelper struct {
}

var CommonHelperObject CommonHelper

func (i CommonHelper) CheckMobile(phone string) bool {
	// 匹配规则
	// ^1第一位为一
	// [345789]{1} 后接一位345789 的数字
	// \\d \d的转义 表示数字 {9} 接9位
	// $ 结束符
	regRuler := "^1[3456789]{1}\\d{9}$"

	// 正则调用规则
	reg := regexp.MustCompile(regRuler)

	// 返回 MatchString 是否匹配
	return reg.MatchString(phone)
}
func (i CommonHelper) CheckQq(qq string) bool {
	// 匹配规则
	regRuler := "[1-9][0-9]{4,12}$"
	// 正则调用规则
	reg := regexp.MustCompile(regRuler)
	// 返回 MatchString 是否匹配
	return reg.MatchString(qq)
}

/**
 * @param $str
 * @param $length
 * @param int $type 1为普通验证,0为汉字验证
 * @param int zero 0为验证是否小于等于0 1为只验证是否大于传入参数
 * @param int checkSpecial 0为验证是否有特殊字符
 * @return bool
 * 默认 type = 1 默认  zero = 1 默认 checkSpecial=0
 */

func (i CommonHelper) CheckLength(str string, length int, typeParams int, zero, checkSpecial int) bool {
	if checkSpecial == 1 {
		//处理特殊字符
		if !i.CheckSpecialChar(str) {
			return false
		}
	}
	lenTmp := 0
	if typeParams == 1 {
		//1为普通验证,0为汉字验证
		lenTmp = len(str)
	} else {
		//1为普通验证,0为汉字验证
		splitStr := strings.Split(str, "")
		lenTmp = len(splitStr)
	}
	if zero == 0 {
		if lenTmp > 0 && lenTmp <= length {
			return true
		}
	} else {
		if lenTmp <= length {
			return true
		}
	}
	return false
}

func (i CommonHelper) CheckSpecialChar(str string) bool {

	tmp := make([]string, 0)
	tmp = append(tmp, "|", ",", "～", "，", "。", "！", "？", `“`, `”`, "’", "‘", "·", "~", "!", "@", "#", "$", "%", "^", "&", "^", "*", "(", ")", "_", "+", "{", "}", ":", "<", ">", "?", "|", "[", "]", ",", ".", "`", "=", `\`, "/")
	for _, i3 := range tmp {
		if strings.Contains(str, i3) {
			fmt.Println(i3)
			return false
		}
	}
	return true

	// 匹配规则
	//regRuler := "//|～|，|。|！|？|“|”|【|】|『|』|：|；|《|》|’|‘| |·|~|!|@|#|$|%|^|&|\\*|(|)|_|\\+|{|}|:|<|>|\\?|[|]|,|.|/|;|'|`|-|=|\\||/"
	//regRuler := "//|～|，|。|！|\\？|\\“|\\”|\\【|\\】|\\『|\\』|\\：|\\；|\\《|\\》|\\’|\\‘|\\ |\\·|\\~|\\!|\\@|\\#|\\\\$|\\%|\\^|\\&|\\*|\\(|\\)|\\_|\\+|\\{|\\}|\\:|\\<|\\>|\\?|\\[|\\]|\\,|\\.|\\/|\\;|\\'|\\`|\\-|\\=|\\\\\\|\\|/"

	//rules := "// |/【|/】|/（|/）|/，|/。|/？|/、|/；|/：|/‘|/’|/“|/”|/！|/《|/》|/￥|/……|/——|//|/~|/!|/@|/#|/$|/%|/^|/&|/*|/(|/)|/_|/+|/{|/}|/:|/<|/>|/?|/[|/]|/,|/.|//|/;|/'|/`|/-|/=|///|/|/"
	//rules := "/\\/|\\～|\\，|\\。|\\！|\\？|\\“|\\”|\\【|\\】|\\『|\\』|\\：|\\；|\\《|\\》|\\’|\\‘|\\ |\\·|\\~|\\!|\\@|\\#|\\\\$|\\%|\\^|\\&|\\*|\\(|\\)|\\_|\\+|\\{|\\}|\\:|\\<|\\>|\\?|\\[|\\]|\\,|\\.|\\/|\\;|\\'|\\`|\\-|\\=|\\\\\\|\\|/"

	//
	//// /\ |\【|\】|\（|\）|\，|\。|\？|\、|\；|\：|\‘|\’|\“|\”|\！|\《|\》|\￥|\……|\——|\/|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\+|\{|\}|\:|\<|\>|\?|\[|\]|\,|\.|\/|\;|\'|\`|\-|\=|\\\|\|/
	////————————————————
	////版权声明：本文为CSDN博主「weixin_44134816」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
	////原文链接：https://blog.csdn.net/weixin_44134816/article/details/127320023
	//
	//a := `/\ |\【|\】|\（|\）|\，|\。|\？|\、|\；|\：|\‘|\’|\“|\”|\！|\《|\》|\￥|\……|\——|\/|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\+|\{|\}|\:|\<|\>|\?|\[|\]|\,|\.|\/|\;|\'|\`|\-|\=|\\\|\|/
	//————————————————
	//版权声明：本文为CSDN博主「weixin_44134816」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
	//原文链接：https://blog.csdn.net/weixin_44134816/article/details/127320023`
	// 正则调用规则
	//reg := regexp.MustCompile(rules)
	//// 返回 MatchString 是否匹配
	//tmp := reg.MatchString(str)
	//return tmp
}

// 如果存在特殊字符，直接在特殊字符前添加\
/**
判断是否为字母： unicode.IsLetter(v)
判断是否为十进制数字： unicode.IsDigit(v)
判断是否为数字： unicode.IsNumber(v)
判断是否为空白符号： unicode.IsSpace(v)
判断是否为Unicode标点字符 :unicode.IsPunct(v)
判断是否为中文：unicode.Han(v)
*/

func (i CommonHelper) SpecialLetters(letter rune) (bool, []rune) {
	if unicode.IsPunct(letter) || unicode.IsSymbol(letter) || unicode.Is(unicode.Han, letter) {
		var chars []rune
		chars = append(chars, '\\', letter)
		return true, chars
	}
	return false, nil
}

//func TestSpecailLetter(t *testing.T) {
//	str := "//|～|，|。|！|？|“|”|【|】|『|』|：|；|《|》|’|‘| |·|~|!|@|#|$|%|^|&|*|(|)|_|+|{|}|:|<|>|?|[|]|,|.|/|;|'|`|-|=|\\||/"
//	str := `1234~!@#$%^&*()_+}{":?><"⌘开`
//	var chars []rune
//	for _, letter := range str {
//		ok, letters := CommonHelper.SpecialLetters(letter)
//		if ok {
//			chars = append(chars, letters...)
//		} else {
//			chars = append(chars, letter)
//		}
//	}
//	fmt.Println(string(chars))
//}

func (i CommonHelper) MD5(str string) string {
	data := []byte(str) //切片
	has := md5.Sum(data)
	md5str := fmt.Sprintf("%x", has) //将[]byte转成16进制
	return md5str
}
func (i CommonHelper) MD51(str string) string {
	data := []byte(str)
	md5Ctx := md5.New()
	md5Ctx.Write(data)
	cipherStr := md5Ctx.Sum(nil)
	//fmt.Println(cipherStr)
	//fmt.Printf("%x\n", md5.Sum(data))
	//fmt.Printf("%x\n", cipherStr)
	//fmt.Println(hex.EncodeToString(cipherStr))
	return hex.EncodeToString(cipherStr)
}
